package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	source := "/Users/dean/GoWorks/src/gomod/lessonGoIO/aaa/王定勇_Java后端开发.png"
	//复制过来的源文件  必须也有文件名
	destination := "/Users/dean/GoWorks/src/gomod/lessonGoIO/xk-copy3.png"
	//copy(source, destination, 1024)
	copy2(destination, source)
}

func copy3(destination, source string) {
	//不建议使用这种创建文件   因为可能一个文件太大  直接把buffer撑爆了  导致内存溢出
	buffer, _ := os.ReadFile(source)
	err := os.WriteFile(destination, buffer, 0777)
	fmt.Println(err)

}

func copy2(destination, source string) {
	//输入文件  输出的file对象
	sourceFile, err := os.Open(source)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer sourceFile.Close()

	//连接输出文件   可能目标文件是不存在的所以使用O_CREATE 不存在的话就创建
	destinationFile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer destinationFile.Close()

	written, _ := io.Copy(destinationFile, sourceFile)
	fmt.Println("文件大小：", written)

}

func copy(source, destination string, bufSize int) {
	//输入文件
	sourceFile, err := os.Open(source)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer sourceFile.Close()

	//连接输出文件   可能目标文件是不存在的所以使用O_CREATE 不存在的话就创建！！！
	destinationFile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer destinationFile.Close()

	//缓冲区
	buf := make([]byte, bufSize)

	for {
		//读取
		n, err := sourceFile.Read(buf)
		if err == io.EOF || n == 0 {
			fmt.Println("文件复制完毕")
			break
		}
		//写出
		_, err = destinationFile.Write(buf[:n])
		if err != nil {
			fmt.Println("写入失败", err)
		}
	}
}
